// package com.xuyuan.json.jackson.study;
//
// import cn.hutool.core.util.StrUtil;
// import com.dap.flow.design.codegen.jcodemodel.ConstantsJcode;
// import com.dap.flow.design.codegen.jcodemodel.field.JFieldVarAnnotationFill;
// import com.dap.flow.design.codegen.commonjava.metainfo.ParamInfo;
// import com.dap.flow.design.codegen.web.StructNode;
// import com.dap.flow.design.config.FlowConstConfig;
// import com.fasterxml.jackson.annotation.JsonAutoDetect;
// import com.fasterxml.jackson.annotation.OptBoolean;
// import com.helger.jcodemodel.*;
//
// import java.math.BigDecimal;
// import java.util.Objects;
//
// public class JsonAnnotationFill implements JFieldVarAnnotationFill {
//
//     @Override
//     public void fill(JCodeModel jCodeModel, JDefinedClass definedClass, ParamInfo paramInfo) {
// //        JAnnotationUse annotation = definedClass.getAnnotation(JsonAutoDetect.class);
// //        if(annotation == null){
// //            annotation = definedClass.annotate(jCodeModel.ref("com.fasterxml.jackson.annotation.JsonAutoDetect"));
// //            annotation.param("getterVisibility", com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE);
// //        }
//
//         JFieldVar var = createField(jCodeModel, definedClass, paramInfo);
//         AbstractJClass ref = jCodeModel.ref(ConstantsJcode.JSON_PROPERTY);
//         JAnnotationUse annotate = var.annotate(ref);
//         annotate.param("value", StrUtil.toUnderlineCase(paramInfo.getPropCode()));
//
//         String wrapperClassName = paramInfo.getWrapperClassName();
//         if(FlowConstConfig.messageBodyTypeIsArray() && StrUtil.isNotBlank(wrapperClassName)){
//             AbstractJClass refWrapper = jCodeModel.ref(ConstantsJcode.JSON_WRAPPER_ARRAY);
//             JAnnotationUse annotateWrapper = var.annotate(refWrapper);
//             annotateWrapper.param("value", jCodeModel.ref(wrapperClassName));
//             annotateWrapper.param("bindings", jCodeModel.ref(paramInfo.getPropType()));
//             annotateWrapper.param("hasArray",true);
//         }
//
//         if (StrUtil.equals("java.math.BigDecimal", paramInfo.getParamType())) {
//             AbstractJClass jdeser = jCodeModel.ref(ConstantsJcode.JSON_SERIALIZE);
//             AbstractJClass bigDecimalDeserializer = jCodeModel.ref(ConstantsJcode.BIGDECIMAL_SERIALIZE);
//             JAnnotationUse annotate1 = var.annotate(jdeser);
//             annotate1.param("using", bigDecimalDeserializer);
//         }
//
//
//         if (Objects.nonNull(paramInfo.getFormat()) && StrUtil.equals("java.util.Date", paramInfo.getParamType())) {
//             AbstractJClass jdeser = jCodeModel.ref(ConstantsJcode.JSON_DESERIALIZE);
//             AbstractJClass bigDecimalDeserializer = jCodeModel.ref(ConstantsJcode.DATE_DESERIALIZE);
//             JAnnotationUse annotate1 = var.annotate(jdeser);
//             annotate1.param("using", bigDecimalDeserializer);
//
//             AbstractJClass dateFormat = jCodeModel.ref(ConstantsJcode.DATE_FORMAT);
//             JAnnotationUse annotate2 = var.annotate(dateFormat);
//             annotate2.param("pattern", paramInfo.getFormat());
//
//             AbstractJClass ref1 = jCodeModel.ref(ConstantsJcode.JsonSerialize);
//
//             AbstractJClass bigDecimalDeserializer1 = jCodeModel.ref(ConstantsJcode.DateSerializer);
//             JAnnotationUse annotate3 = var.annotate(ref1);
//             annotate3.param("using", bigDecimalDeserializer1);
//
//         }
//
//         if ("java.time.LocalDate".equals(paramInfo.getPropType())){
//
//             AbstractJClass dateFormat = jCodeModel.ref(ConstantsJcode.DATE_FORMAT);
//             JAnnotationUse annotate2 = var.annotate(dateFormat);
//             if(StrUtil.isNotBlank(paramInfo.getFormat())){
//                 annotate2.param("pattern",paramInfo.getFormat());
//             }
//
//         }
//
//         //list添加额外注解
//         if (StrUtil.equals("java.util.List", paramInfo.getParamType())) {
//             AbstractJClass refWrapper = jCodeModel.ref(ConstantsJcode.JSON_WRAPPER_ARRAY);
//             JAnnotationUse annotateWrapper = var.annotate(refWrapper);
//             annotateWrapper.param("value", jCodeModel.ref(paramInfo.getPropType()));
//             annotateWrapper.param("bindings", jCodeModel.ref(paramInfo.getGenericClass()));
//             annotateWrapper.param("hasArray",false);
//         }
//
//     }
//
//     @Override
//     public void fill(JCodeModel jCodeModel, JDefinedClass definedClass, StructNode node) {
//         JFieldVar var = createField(jCodeModel, definedClass, node);
//         AbstractJClass ref = jCodeModel.ref(ConstantsJcode.JSON_PROPERTY);
//         JAnnotationUse annotate = var.annotate(ref);
//         annotate.param("value", StrUtil.toUnderlineCase(node.getMsgStructCode()));
//     }
// }
